package designpatterns.creation;


/**
 * 单例模式
 * 使用场景 加载配置文件、连接池、整个应用的计数器、应用程序的日志
 *
 * @author jack.wu
 * @since 2019/9/18
 */
public class SingleTest {

}

/**
 * 饿汉式
 * 优点：实现起来简单，线程安全(静态初始化器的方式，借助JVM来实现线程安全)
 * 缺点：类被加载的时候会一直占用静态变量分配的内存空间，可以被反射破解
 */
class Singleton1 {

    private Singleton1() {
    }

    private static final Singleton1 INSTANCE = new Singleton1();

    public static Singleton1 getInstance() {
        return INSTANCE;
    }
}

/**
 * 懒汉式
 * 优点：实现起来简单，只有使用的时候才会占用内存空间，线程安全
 * 缺点：效率低下，可以被反射破解
 */
class Singleton2 {

    private Singleton2() {
    }

    private static Singleton2 INSTANCE = null;

    public static synchronized Singleton2 getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new Singleton2();
        }
        return INSTANCE;
    }

}

/**
 * 双重校验锁
 * 优点：比懒汉式速度快，线程安全，懒加载
 * 缺点：可以被反射破解
 */
class Singleton3 {

    private Singleton3() {
    }

    private static Singleton3 instance = null;

    public static Singleton3 getInstance() {
        if (instance == null) {
            synchronized (Singleton3.class) {
                if (instance == null) {
                    instance = new Singleton3();
                }
            }
        }
        return instance;
    }
}

/**
 * 静态内部类
 * 优点: 性能最好，线程安全(静态初始化器的方式，借助JVM来实现线程安全)，懒加载
 */
class Singleton4 {

    private Singleton4() {
    }

    private static class SingletonInner {
        private static Singleton4 instance = new Singleton4();
    }

    public static Singleton4 getInstance() {
        return SingletonInner.instance;
    }
}

/**
 * 使用枚举
 * 优点：效率快、线程安全、不能被反射破解
 */
enum Singleton5 {

    /**
     * 单例对象
     */
    INSTANCE;

    /**
     * 可以做一些别的事情
     */
    public void doSomething() {
    }
}
